// 学生答题卡
import { defineStore } from 'pinia';

// 1. 定义学生答题卡对象的接口
interface sysStudentAnswerSheet {
    id: string; // 答题卡 ID (类型已修改为 string)
    tesPaperId: string; // 试题 ID (类型已修改为 string)
    tesPaperName: string; // 试题名称
    studentId: number; // 学生 ID
    studentName: string; // 学生姓名
    teacherId: number; // 教师 ID
    teacherName: string; // 教师姓名
    subject: string; // 科目
    content: string; // 答题内容
    objectiveTestScores: number; // 客观题得分
    subjTestScores: number; // 主观题得分
    totalScores: number; // 总得分
    createTime: string; // 创建时间 (开始答题时间)
    endTime: string; // 结束时间 (提交试卷时间)
    timeTaken: string; // 用时 (例如: "01:30:25")
    timeLimit: string; // 时间限制 (例如: "01:30:25")
    state: number;   // 状态(1: 等待/未开始, 2: 进行中, 3: 等待教师评分,4.完成)
}

export const useSysStudentAnswerSheetStore = defineStore('sysStudentAnswerSheet', {
    // 2. state 的类型定义
    state: (): { sysStudentAnswerSheet: sysStudentAnswerSheet[] } => ({
        sysStudentAnswerSheet: [], // 初始化为空数组，存储所有答题卡
    }),

    // 3. Getters: 用于从 state 中派生出一些状态
    getters: {
        /**
         * 根据传入的条件对象，筛选出所有匹配的试题
         */
        findPapersByConditions: (state) => {
            return (query: Partial<sysStudentAnswerSheet>): sysStudentAnswerSheet[] => {
                const activeConditions = Object.entries(query).filter(
                    ([_, value]) => value !== null && value !== undefined && value !== ''
                );

                if (activeConditions.length === 0) {
                    return [];
                }

                return state.sysStudentAnswerSheet.filter(paper => {
                    return activeConditions.every(([key, value]) => {
                        return String(paper[key as keyof sysStudentAnswerSheet])
                            .toLowerCase()
                            .includes(String(value).toLowerCase());
                    });
                });
            };
        },

        /**
         * 获取所有答题卡列表
         */
        getAllSheets(): sysStudentAnswerSheet[] {
            return this.sysStudentAnswerSheet;
        },

        /**
         * 根据 ID 查找单个答题卡
         * @param state
         */
        getSheetById: (state) => (id: string) => { // 参数类型已修改
            return state.sysStudentAnswerSheet.find((sheet) => sheet.id === id);
        },

        /**
         * 根据学生 ID 查找该学生的所有答题记录
         */
        getSheetsByStudentId: (state) => (studentId: number) => {
            return state.sysStudentAnswerSheet.filter((sheet) => sheet.studentId === studentId);
        },

        /**
         * 根据试题 ID 查找所有提交了该试题的学生答题记录
         * @param state
         */
        getSheetsByPaperId: (state) => (tesPaperId: string) => { // 参数类型已修改
            return state.sysStudentAnswerSheet.filter((sheet) => sheet.tesPaperId === tesPaperId);
        },

        /**
         * 查找特定学生对特定试题的答题卡
         * @param state
         */
        getSheetByStudentAndPaper: (state) => (studentId: number, tesPaperId: string) => { // 参数类型已修改
            return state.sysStudentAnswerSheet.find(
                (sheet) => sheet.studentId === studentId && sheet.tesPaperId === tesPaperId
            );
        },
    },

    // 4. Actions: 用于修改 state 的方法，支持异步操作
    actions: {
        /**
         * 添加新的答题卡记录
         * @param sheet - 要添加的答题卡对象 (不包含 id)
         */
        addSheet(sheet: Omit<sysStudentAnswerSheet, 'id'>) {
            // 模拟生成一个唯一的 string ID (例如使用时间戳和随机数)
            const newId = `sheet_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;

            const newSheet: sysStudentAnswerSheet = {
                id: newId,
                ...sheet,
                createTime: new Date().toISOString(),
                state: 2, // 初始状态为“进行中”
            };
            this.sysStudentAnswerSheet.push(newSheet);
            console.log('答题卡已添加:', newSheet);
            return newSheet;
        },

        /**
         * 更新一个已存在的答题卡
         * @param updatedSheet - 包含更新后数据的答题卡对象 (必须包含 id)
         */
        updateSheet(updatedSheet: sysStudentAnswerSheet) {
            console.log('准备更新答题卡:', updatedSheet);
            if (!updatedSheet.id) {
                console.error('更新失败：答题卡缺少 ID');
                return;
            }
            const index = this.sysStudentAnswerSheet.findIndex((sheet) => sheet.id === updatedSheet.id);
            if (index !== -1) {
                this.sysStudentAnswerSheet[index] = { ...this.sysStudentAnswerSheet[index], ...updatedSheet };
                console.log('答题卡已更新:', this.sysStudentAnswerSheet[index]);
                return 1;
            } else {
                console.error('更新失败：未找到 ID 为', updatedSheet.id, '的答题卡');
                return 0;
            }
        },

        /**
         * 根据 ID 删除一个答题卡
         * @param id - 要删除的答题卡的 ID (类型已修改)
         */
        deleteSheet(id: string) { // 参数类型已修改
            const index = this.sysStudentAnswerSheet.findIndex((sheet) => sheet.id === id);
            if (index !== -1) {
                this.sysStudentAnswerSheet.splice(index, 1);
                console.log('ID 为', id, '的答题卡已删除');
                return 1;
            } else {
                console.error('删除失败：未找到 ID 为', id, '的答题卡');
                return 0;
            }
        },

        /**
         * 提交试卷，这是一个复合操作
         * @param id - 要提交的答题卡 ID (类型已修改)
         * @param finalContent - 最终的答题内容
         * @param objectiveScore - 客观题得分
         * @param subjectiveScore - 主观题得分
         */
        submitSheet(id: string, finalContent: string, objectiveScore: number, subjectiveScore: number) { // 参数类型已修改
            // 注意：在 action 中调用 getter，需要直接使用 `this` 来访问
            const sheet = this.getSheetById(id);
            if (sheet) {
                const endTime = new Date();
                const startTime = new Date(sheet.createTime!);
                const timeDiffMs = endTime.getTime() - startTime.getTime();

                const hours = Math.floor(timeDiffMs / (1000 * 60 * 60));
                const minutes = Math.floor((timeDiffMs % (1000 * 60 * 60)) / (1000 * 60));
                const seconds = Math.floor((timeDiffMs % (1000 * 60)) / 1000);
                const timeTaken = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;

                const totalScore = objectiveScore + subjectiveScore;

                this.updateSheet({
                    ...sheet,
                    content: finalContent,
                    objectiveTestScores: objectiveScore,
                    subjTestScores: subjectiveScore,
                    totalScores: totalScore,
                    endTime: endTime.toISOString(),
                    timeTaken: timeTaken,
                    state: 3, // 状态更新为“已完成”
                });
                console.log('试卷提交成功!');
            } else {
                console.error('提交失败：未找到答题卡');
            }
        },
    },

    // 5. 持久化配置
    persist: true,
});
